function [reme,r_p,r_s,r_c] = Q2f_2(init_data)

    global remember;
    global r_pos;
    global r_str;
    global r_cost;
    global yield;
    remember = [0,0,0,0];
    r_cost = 0;
    r_pos = 1;
    profit = 0;   % 一单位总共的利润
    yield = [0,0,0];
    Defective_rate = [0,0,0];  %  生产一单位的成品a零件和b零件的次品率
    str = '';
    cost(init_data,1,profit,Defective_rate,str);
    reme = remember;
    r_p = r_pos;
    r_s = r_str;
    r_c = r_cost;
end

% 计算零件花费

function ret = cost(init_data,pos , profit ,Defective_rate,str)
    global yield;
    % 不进行检测
    % 新利润等于旧利润减去零件的花费
    profit_now = profit - init_data(pos,2);
    % 次品率等于原次品率
    Defective_rate(pos) = init_data(pos,1);
    yield(pos) = 1;
    % 加上调试信息
    sstr = str + "零件"+num2str(pos) + "不进行检查" + num2str(profit_now)+"  ";
    % pos为1的话接下来去判断零件2是否检测
    % pos为2的话接下来去判断成品是否检测
    % 不检查的话生产量不变
    if(pos == 1)
        cost(init_data,2,profit_now,Defective_rate,sstr);
    elseif(pos == 2)
        cost_fg(init_data,profit_now,Defective_rate,sstr);
    end


    % 进行检测
    % 新利润等于旧利润减去零件的花费 再减去检测成本
    profit_now = profit - init_data(pos,2)-init_data(pos,3);
    yield(pos) = 1 - init_data(pos,1);
    % 检测后次品率为0
    Defective_rate(pos) = 0;

    % 加上调试信息
    sstr = str + "零件"+num2str(pos) + "进行检查" + num2str(profit_now)+"  ";
    % 有一部分,检测出来故障,扔了
    if(pos == 1)
        cost(init_data,2,profit_now,Defective_rate,sstr);
    elseif(pos == 2)
        cost_fg(init_data,profit_now,Defective_rate,sstr);
    end
end


% 调整成品
function ret = cost_fg(init_data , profit ,Defective_rate,str)
    global yield;
    % 不进行检测
    % 新利润等于旧利润减去组装的花费
    profit_now = profit - init_data(3,2)*(min(yield(1),yield(2)));
    % 次品率 :1,2,成品 的基本次品率相互独立,只要算出不出错的概率再用1减去不出错的概率即可
    yield(3) = min(yield(1),yield(2));
    fg_no_error = (1-Defective_rate(1)) * (1-Defective_rate(2)) * (1 -init_data(3,1));
    Defective_rate(3) = 1 - fg_no_error;
    % 加上调试信息
    sstr = str + "成品不进行检查"+ num2str(profit_now)+"  ";
    cost_sell(init_data,profit_now,Defective_rate,sstr);


    % 进行检测
    yield(3) = fg_no_error;
    % 新利润等于旧利润减去组装的花费 再减去检测成本
    profit_now = profit - (init_data(3,2)+init_data(3,3))*(min(yield(1),yield(2)));
    % 检测后次品率为0
    Defective_rate(1) = 0;
    Defective_rate(2) = 0;
    Defective_rate(3) = 0;

    % 加上调试信息
    sstr = str + "成品检查后不拆"+ num2str(profit_now)+"  ";
    % 有Defective_rate(3)的概率是次品,所以卖出1 - Defective_rate(3)间商品
    cost_sell(init_data,profit_now,Defective_rate,sstr);
    

    % 进行检测并回收完好零件
    % 新利润等于旧利润减去组装的花费 再减去检测成本 再减去部分拆解的花费 加上获得零件的利润
    profit_now = profit - (init_data(3,2)+init_data(3,3))*(min(yield(1),yield(2)));

    % 计算故障率

    % 拆解花费为 故障率*拆解费
    profit_now = profit_now -(min(yield(1),yield(2))- fg_no_error) * init_data(4,3);

    % 获得零件的利润

    Unqualified_pos1_qualified = (1 - Defective_rate(1)) *  (1 - (1 - Defective_rate(2) )*(1 - init_data(3,1)) ) ;
    Unqualified_pos2_qualified = (1 - Defective_rate(2)) *  (1 - (1 - Defective_rate(1) )*(1 - init_data(3,1)) ) ;

    profit_now = profit_now + Unqualified_pos1_qualified * (init_data(1,2)+init_data(1,3)) + Unqualified_pos2_qualified * (init_data(2,2)+init_data(2,3));
    sstr = str + "成品检查后拆"+ num2str(profit_now)+"  ";

    cost_sell(init_data,profit_now,Defective_rate,sstr);
end


function ret = cost_sell(init_data , profit ,Defective_rate,str)
    % 售卖的话只需要把利润加上售价即可
    global yield;
    profit = profit + init_data(4,1)*yield(3);
    str = str + "制造出了"+num2str(yield(3))+"件商品"+ num2str(profit)+"  ";
    cost_after_sales(init_data , profit ,Defective_rate,str);
end




% 售卖完毕,进行售后
function ret = cost_after_sales(init_data , profit ,Defective_rate,str)
    global remember;
    global r_pos;
    global r_str;
    global r_cost;
    % 首先所有不合格商品进行调换 ,原价减去  调换花费乘成品坏的概率
    % 是否进行拆解
    % 
    profit = profit - (init_data(4,2) + (28+56)/2)* Defective_rate(3);
    sstr = str + "不合格进行报废"+ num2str(profit)+"  ";

    fprintf("%s 利润为%s \n",sstr,num2str(profit));

    remember(r_pos) = profit;
    r_pos= r_pos + 1;
    if(r_cost < profit)
        r_cost = profit;
        r_str = sstr;
    end
    % 对不合格的商品拆解时可能会获得合格的零件
    % 如果合格的零件费用大于拆解花费的话,相当于获利

    % 次品率 :1,2,成品 的基本次品率相互独立
    % 零件1不出错但是成品出错
    % 1 单位成品,不合格Defective_rate(3)个
    tmp = 0;
    if(Defective_rate(3) ~= 0)
        tmp = init_data(3,1);
    end
    % 1 单位成品,保证零件一合格,零件2或(和)成品组装不合格 有(1 - p1) *(1 - (1 - p2)*(1 - p3))
    Unqualified_pos1_qualified = (1 - Defective_rate(1)) *  (1 - (1 - Defective_rate(2) )*(1 - tmp) ) ;
    Unqualified_pos2_qualified = (1 - Defective_rate(2)) *  (1 - (1 - Defective_rate(1) )*(1 - tmp) ) ;

    profit = profit - init_data(4,3) *Defective_rate(3); % 减去拆解费用
    % 加上新零件的费用
    profit = profit +Unqualified_pos1_qualified * (init_data(1,2)+init_data(1,3)) + Unqualified_pos2_qualified * (init_data(2,2)+init_data(2,3));
    sstr = str + "不合格进行回收"+ num2str(profit)+"  ";

    fprintf("%s 利润为%s \n",sstr,num2str(profit));
    remember(r_pos) = profit;
    r_pos= r_pos + 1;
    if(r_cost < profit)
        r_cost = profit;
        r_str = sstr;
    end
end






















